package edu.client;

import java.util.List;

import com.google.gwt.core.client.GWT;
import com.google.gwt.dom.client.Style.Unit;
import com.google.gwt.event.dom.client.ClickEvent;
import com.google.gwt.event.dom.client.ClickHandler;
import com.google.gwt.i18n.client.DateTimeFormat;
import com.google.gwt.user.client.Window;
import com.google.gwt.user.client.rpc.AsyncCallback;
import com.google.gwt.user.client.ui.Button;
import com.google.gwt.user.client.ui.Composite;
import com.google.gwt.user.client.ui.FlexTable;
import com.google.gwt.user.client.ui.HTMLTable.Cell;
import com.google.gwt.user.client.ui.HasHorizontalAlignment;
import com.google.gwt.user.client.ui.Label;
import com.google.gwt.user.client.ui.LayoutPanel;
import com.google.gwt.user.client.ui.ListBox;
import com.google.gwt.user.client.ui.RadioButton;
import com.google.gwt.user.client.ui.ScrollPanel;
import com.google.gwt.user.client.ui.TabPanel;

import edu.client.ComprasService.ComprasService;
import edu.client.ComprasService.ComprasServiceAsync;
import edu.shared.DTO.OrdenCompraProductoDTO;

public class P_EditarOrdenCompraProductoSeleccion extends Composite{
	
	//columna de la tabla de órdens de compra
	private static final int COL_CHECK = 0;
	private static final int COL_NUMERO_ORDEN = 1;
	private static final int COL_FECHA_GENERACION = 2;
	private static final int COL_PROVEEDOR = 3;
	private static final int COL_ESTADO_ORDEN = 4;
	private static final int COL_MAS_INFO = 5;
	
	private ListBox cbProveedores;
	private FlexTable ftOrdenes;
	
	private TabPanel tpPadre;
	private ComprasServiceAsync comprasService;
	private List<String> proveedores;
	private List<OrdenCompraProductoDTO> ordenes;
	
	public P_EditarOrdenCompraProductoSeleccion(TabPanel padre)
	{
		tpPadre = padre;
		comprasService = GWT.create(ComprasService.class);
		
		LayoutPanel layoutPanel = new LayoutPanel();
		initWidget(layoutPanel);		
		layoutPanel.setSize((Window.getClientWidth() - 55) + "px", "622px");
		
		Label lblFiltrarPor = new Label("FILTROS");
		lblFiltrarPor.setStyleName("labelTitulo");
		layoutPanel.add(lblFiltrarPor);
		layoutPanel.setWidgetLeftWidth(lblFiltrarPor, 2.5, Unit.PCT, 95.0, Unit.PCT);
		layoutPanel.setWidgetTopHeight(lblFiltrarPor, 15.0, Unit.PX, 50.0, Unit.PX);
		
		Label lblProveedor = new Label("PROVEEDOR:");
		lblProveedor.setHorizontalAlignment(HasHorizontalAlignment.ALIGN_RIGHT);
		layoutPanel.add(lblProveedor);
		layoutPanel.setWidgetLeftWidth(lblProveedor, 0.0, Unit.PCT, 17.3, Unit.PCT);
		layoutPanel.setWidgetTopHeight(lblProveedor, 85.0, Unit.PX, 19.0, Unit.PX);
		
		cbProveedores = new ListBox();		
		layoutPanel.add(cbProveedores);
				
		layoutPanel.setWidgetLeftWidth(cbProveedores, 17.5, Unit.PCT, 25.0, Unit.PCT);
		layoutPanel.setWidgetTopHeight(cbProveedores, 80.0, Unit.PX, 32.0, Unit.PX);
		

		
		Button btnFiltrar = new Button("");
		btnFiltrar.setText("BUSCAR");
		
		//cuando se presiona el botón filtrar
		btnFiltrar.addClickHandler(new ClickHandler() {
			public void onClick(ClickEvent event) {
				String proveedor = null;
				
				//si no se seleccionó "<Todos>"
				if(cbProveedores.getSelectedIndex() != 0)
					proveedor = cbProveedores.getValue(cbProveedores.getSelectedIndex());
				
				filtrarOrdenes(proveedor);
			}
		});

		layoutPanel.add(btnFiltrar);
		layoutPanel.setWidgetLeftWidth(btnFiltrar, 45.0, Unit.PCT, 10.0, Unit.PCT);
		layoutPanel.setWidgetTopHeight(btnFiltrar, 135.0, Unit.PX, 28.0, Unit.PX);
		
		// seteamos el estilo a los encabezados
		
		Label lblOrdenes = new Label("ÓRDENES DE COMPRA DE PRODUCTOS");
		lblOrdenes.setStyleName("labelTitulo");
		layoutPanel.add(lblOrdenes);
		layoutPanel.setWidgetLeftWidth(lblOrdenes, 2.5, Unit.PCT, 95.0, Unit.PCT);
		layoutPanel.setWidgetTopHeight(lblOrdenes, 180.0, Unit.PX, 50.0, Unit.PX);
		
		ScrollPanel spOrdenes = new ScrollPanel();
		spOrdenes.setStyleName("tabla");
		layoutPanel.add(spOrdenes);
		layoutPanel.setWidgetLeftWidth(spOrdenes, 5.0, Unit.PCT, 90.0, Unit.PCT);
		layoutPanel.setWidgetTopHeight(spOrdenes, 250.0, Unit.PX, 250.0, Unit.PX);
		
		ftOrdenes = new FlexTable();
		spOrdenes.setWidget(ftOrdenes);
		ftOrdenes.setSize("100%", "100%");
		
		//columnas de la tabla de órdenes
		
		//columna número de orden
		ftOrdenes.setText(0, COL_CHECK, "");
		ftOrdenes.getCellFormatter().setWidth(0, COL_CHECK, "5%");
		
		//columna número de orden
		ftOrdenes.setText(0, COL_NUMERO_ORDEN, "Nº ORDEN COMPRA");
		ftOrdenes.getCellFormatter().setWidth(0, COL_NUMERO_ORDEN, "15%");
		
		//columna fecha de generación
		ftOrdenes.setText(0, COL_FECHA_GENERACION, "FECHA DE GENERACIÓN");
		ftOrdenes.getCellFormatter().setWidth(0, COL_FECHA_GENERACION, "15%");
		
		//columna proveedor
		ftOrdenes.setText(0, COL_PROVEEDOR, "PROVEEDOR");
		ftOrdenes.getCellFormatter().setWidth(0, COL_PROVEEDOR, "30%");
		
		//columna estado orden
		ftOrdenes.setText(0, COL_ESTADO_ORDEN, "ESTADO");
		ftOrdenes.getCellFormatter().setWidth(0, COL_ESTADO_ORDEN, "25%");
		
		//columna más información
		ftOrdenes.setText(0, COL_MAS_INFO, "+ INFO");
		ftOrdenes.getCellFormatter().setWidth(0, COL_MAS_INFO, "10%");
		
		ftOrdenes.getRowFormatter().addStyleName(0, "tablaEncabezado");
		
		Label lblPie = new Label("");
		lblPie.setStyleName("labelTitulo");
		layoutPanel.add(lblPie);
		layoutPanel.setWidgetLeftWidth(lblPie, 2.5, Unit.PCT, 95.0, Unit.PCT);
		layoutPanel.setWidgetTopHeight(lblPie, 500.0, Unit.PX, 50.0, Unit.PX);
		
		Button btnSalir = new Button("");
		btnSalir.setText("CANCELAR");
		
		//al presionar el botón salir
		btnSalir.addClickHandler(new ClickHandler() {
			public void onClick(ClickEvent event) {
				//cerramos la pantalla
				tpPadre.remove(Validaciones.numeroElemento(tpPadre, "EDITAR ORDEN COMPRA PRODUCTO"));		
			}
		});
		
		layoutPanel.add(btnSalir);
		layoutPanel.setWidgetRightWidth(btnSalir, 5.0, Unit.PCT, 10.0, Unit.PCT);
		layoutPanel.setWidgetBottomHeight(btnSalir, 15.0, Unit.PX, 28.0, Unit.PX);
		
		Button btnEditar = new Button("");
		btnEditar.setText("EDITAR");
		
		//al presionar el botón editar
		btnEditar.addClickHandler(new ClickHandler() {
			public void onClick(ClickEvent event) {
				editarOrden();	
			}
		});
		
		layoutPanel.add(btnEditar);
		layoutPanel.setWidgetRightWidth(btnEditar, 17.5, Unit.PCT, 10.0, Unit.PCT);
		layoutPanel.setWidgetBottomHeight(btnEditar, 15.0, Unit.PX, 28.0, Unit.PX);
		
		cargarProveedores();
		filtrarOrdenes(null);
	}
	
	
	/**
	 * Método que carga el combobox de proveedores con todos los proveedores de la base de datos
	 */
	private void cargarProveedores()
	{
		comprasService.buscarNombresProveedores(new AsyncCallback<List<String>>()
		{
			@Override
			public void onFailure(Throwable caught) {
				Window.alert("ERROR EN EL SERVICIO." + '\n' + '\n' + caught.getMessage());				
			}

			@Override
			public void onSuccess(List<String> result) {
				proveedores = result;
				
				cbProveedores.addItem("TODOS LOS PROVEEDORES");
				
				for(String proveedor : proveedores)
					cbProveedores.addItem(proveedor);
			}
		});
	}
	
	
	/**
	 * Método que filtra las órdenes de compra de producto por el proveedores seleccionado.
	 * Si el proveedor es "< Todos >" se traen todas las órdenes de compra.
	 * @param proveedor. Proveedor seleccionado.
	 */
	private void filtrarOrdenes(String proveedor)
	{
		ftOrdenes.clear();
		
		comprasService.buscarOrdenesCompraProductoPorProveedor(proveedor, "GUARDADA", new AsyncCallback<List<OrdenCompraProductoDTO>>()
		{
			@Override
			public void onFailure(Throwable caught) {
				Window.alert("ERROR EN EL SERVICIO." + '\n' + '\n' + caught.getMessage());	
			}

			@Override
			public void onSuccess(List<OrdenCompraProductoDTO> result) {
				ordenes = result;
				
				//se utiliza para formatear fechas
				DateTimeFormat formatoFecha = DateTimeFormat.getFormat("dd/MM/yyyy");
				
				int numeroFila = 1;
				
				for(OrdenCompraProductoDTO orden : ordenes)
				{
					//columna check
					ftOrdenes.setWidget(numeroFila, COL_CHECK, new RadioButton("orden seleccionada",""));
					ftOrdenes.getFlexCellFormatter().setHorizontalAlignment(numeroFila, COL_CHECK, HasHorizontalAlignment.ALIGN_CENTER);
					
					//columna número de orden
					ftOrdenes.setWidget(numeroFila, COL_NUMERO_ORDEN, new Label(String.valueOf(orden.getIdOrden())));
					ftOrdenes.getCellFormatter().setWordWrap(numeroFila, COL_NUMERO_ORDEN, true);
					
					//columna fecha generación
					ftOrdenes.setWidget(numeroFila, COL_FECHA_GENERACION, new Label(String.valueOf(formatoFecha.format(orden.getFechaGeneracion()))));
					ftOrdenes.getCellFormatter().setWordWrap(numeroFila, COL_FECHA_GENERACION, true);
					
					//columna proveedor
					ftOrdenes.setWidget(numeroFila, COL_PROVEEDOR, new Label(orden.getProveedor()));
					ftOrdenes.getCellFormatter().setWordWrap(numeroFila, COL_PROVEEDOR, true);
					
					//columna estado orden
					ftOrdenes.setWidget(numeroFila, COL_ESTADO_ORDEN, new Label(orden.getEstado()));
					ftOrdenes.getCellFormatter().setWordWrap(numeroFila, COL_ESTADO_ORDEN, true);
					
					// imagen más información
					Label info = new Label("");
					info.setSize("16px", "16px");
					info.setStyleName("labelInfo");
					
					//cuando se presiona "más información"
					info.addClickHandler(new ClickHandler() {
						public void onClick(ClickEvent event) {
							
							//obtenemos la celda en donde se hizo click
							Cell celda = ftOrdenes.getCellForEvent(event);
							
							//obtenemos la orden de fabricación. Restamos 1 al row index porque la fila 1 es el encabezado
							OrdenCompraProductoDTO orden = ordenes.get(celda.getRowIndex() - 1);
							
							cargarMasInformacion(orden.getIdOrden());
						}
					});
					
					// columna más información
					ftOrdenes.setWidget(numeroFila, COL_MAS_INFO, info);
					ftOrdenes.getFlexCellFormatter().setHorizontalAlignment(numeroFila, COL_MAS_INFO, HasHorizontalAlignment.ALIGN_CENTER);
					
					//seteamos el estilo de renglón de tabla
					ftOrdenes.getRowFormatter().setStyleName(numeroFila, "tablaRenglon");
					
					numeroFila++;
				}
			}
		});
	}
	
	/**
	 * Método que muestra toda la información de una orden de compra
	 * @param idOrden
	 */
	private void cargarMasInformacion(int idOrden)
	{
		P_DetalleOrdenCompraProducto pDetalleOrden = new P_DetalleOrdenCompraProducto(idOrden, false);
		pDetalleOrden.setGlassEnabled(true);
		pDetalleOrden.center();
		pDetalleOrden.show();
	}
	
	
	/**
	 * Método que llama a la pantalla editar orden de compra
	 */
	private void editarOrden()
	{
		try
		{
			int idOrden = -1;
			
			int i = 0;
			boolean encontrado = false;
			
			//buscamos las filas de las tablas seleccionadas
			while(i < ordenes.size() && !encontrado)
			{
				RadioButton redioButton = (RadioButton) ftOrdenes.getWidget(i+1, COL_CHECK);
				
				//verificamos si la fila está seleccionada
				if(redioButton.getValue() == true){
					encontrado = true;
					idOrden = ordenes.get(i).getIdOrden();
				}
				
				i++;
			}
			
			//si no se seleccionó ninguna orden de compra...
			if(!encontrado)
				throw new Exception("Seleccione al menos una orden de compra.");
			
			//llamamos a la pantalla editar orden de compra de producto
			int ancho = Window.getClientWidth() - 15;
			int alto = Window.getClientHeight() - 13;
			
			P_EditarOrdenCompraProducto p_EditarOrdenCompra = new P_EditarOrdenCompraProducto(tpPadre, idOrden);
			
			this.getParent().removeFromParent();
			ScrollPanel formulario = new ScrollPanel();
			formulario.setTitle("EDITAR ORDEN COMPRA PRODUCTO");
			formulario.setStyleName("panelFormulario");
			formulario.setSize((ancho - 25) + "px", (alto - 145) + "px");
			formulario.add(p_EditarOrdenCompra);
			tpPadre.add(formulario, "EDITAR ORDEN COMPRA PRODUCTO", false);
			tpPadre.selectTab(Validaciones.numeroElemento(tpPadre, "EDITAR ORDEN COMPRA PRODUCTO"));
			
			tpPadre.setSize((ancho - 5) + "px", (alto - 90) + "px");
	
			for(int j = 0; j < tpPadre.getWidgetCount(); j++) {
				tpPadre.getWidget(j).setSize((ancho - 20) + "px", (alto - 145) + "px");
			}
		}
		
		catch(Exception e)
		{
			Window.alert(e.getMessage());
		}
	}
}
